package cn.larry.spel;

/**
 * 本来想重新写一份测试，最后放弃了，TheTest.java已经足够了。
 */
import java.util.Arrays;

import org.junit.Before;
import org.junit.Test;
import org.springframework.expression.Expression;
import org.springframework.expression.spel.standard.SpelExpressionParser;

/**
 * 不需要构建环境的测试 -- 实际上就是调用接口测试功能。 基本上，SpEL的解析过程包含以下几个步骤： ①构建一个SpElExpressionParser；②提供一个expression
 * string；③SpElExpressionParser解析expression string。 ④从上一步获取的Expression中获取内容。
 * 说明：除了run()是用于演示完整的步骤外，其他的多数都有类的私有变量提供SpElExpressionParser和expression string的变量。
 * 
 * @author LarryZeal
 *
 */
public class TheTest2 {
	private SpelExpressionParser parser; // 统一提供ExpressionParser
	private String str; // 统一提供供解析的字符串。

	/**
	 * 这里是第一步，构建一个SpelExpressionParser。
	 */
	@Before
	public void setUp() {
		parser = new SpelExpressionParser();
	}

	/**
	 * 封装的输出语句。
	 * 
	 * @param obj
	 */
	public void print(Object obj) {
		System.out.println(obj);
	}

	// 从最简单的开始，示范一下SpEL的解析过程。
	@Test
	public void run() {
		SpelExpressionParser parser = new SpelExpressionParser(); // 注意，仅在本测试中出现，之后统一由@Before提供。
		String exp = "'Hello World'";
		Expression expression = parser.parseExpression(exp);
		String value = expression.getValue(String.class);

		print(value);
	}

	// *************************************最简单的解析表达式字符串*************************************
	// dmeo for calling method
	@Test
	public void run1() {
		str = "'hello world'.toUpperCase()";
		Expression expression = parser.parseExpression(str);
		String value = expression.getValue(String.class);

		print(value);
	}

	// dmeo for accessing property of JavaBean
	@Test
	public void run2() {
		str = "'hello world'.bytes"; // String.getBytes() -> bytes is property
		Expression expression = parser.parseExpression(str);
		byte[] value = expression.getValue(byte[].class);

		print(Arrays.toString(value));
	}

	// dmeo for accessing nested property of JavaBean
	@Test
	public void run3() {
		str = "'hello world'.bytes"; // String.getBytes().length -> bytes is property
		Expression expression = parser.parseExpression(str);
		int value = expression.getValue(int.class);

		print(value);
	}

	// dmeo for calling constructor
	@Test
	public void run4() {
		str = "new String('hello world')";
		Expression expression = parser.parseExpression(str);
		String value = expression.getValue(String.class);

		print(value);
	}

	// *************************************根据表达式字符串从指定对象中获取内容*************************************

}
